/*
* @file    : Speed.c
* @author  : Martin
* @brief   : xxx module Header file
*/


/*******************************************************************************
**                          Revision Control History                          **
********************************************************************************
Version   Date         User                Comment
********************************************************************************
    0.1   2019-08-013  Martin            - Initial draft
*******************************************************************************/
/*==============================================================================
=======                             Includes                             =======
==============================================================================*/
#include "Speed.h"
#include <stdbool.h>
/*==============================================================================
=======               Defines & Macros for General Purpose               =======
==============================================================================*/
#define SPEED_MAX        		160u
#define SPEED_MIN        		0u
#define SPEED_RISING_TIME  		3000u // (30000u / 10u) x 10ms
#define SPEED_FALLING_TIME   	SPEED_RISING_TIME

#define SPEED128X_MAX        	(160u << 7)
#define SPEED128X_MIN        	0u

/*==============================================================================
=======                        Constants & Types                         =======
==============================================================================*/

/*==============================================================================
=======                        Global variables                          =======
==============================================================================*/

/*==============================================================================
=======                        Local variables                           =======
==============================================================================*/
static uint16_t speed;
static uint16_t speed128x;
/*==============================================================================
=======                        Global Function                           =======
==============================================================================*/

/*==============================================================================
=======                        Local Function                            =======
==============================================================================*/

/*==============================================================================
=======                    Function Implement List                       =======
==============================================================================*/
void Speed_Init()
{
	speed = 0;
	speed128x = 0;
}

void Speed_10ms()
{
	uint16_t deta = (((uint32_t)SPEED_MAX) << 7) / ((uint32_t)SPEED_RISING_TIME);
	static bool sign_positive = true;

//	speed128x = ((uint16_t)80) << 7;
	// add/substract deta to speed
	if(sign_positive)
	{
		speed128x += deta;
	}
	else
	{
		speed128x -= deta;
	}

	if(speed128x >= SPEED128X_MAX)
	{
		sign_positive = false;
	}
	else if(speed128x < deta)
	{
		sign_positive = true;
	}

	speed = speed128x >> 7;
}

uint16_t Speed_GetSpeed()
{
	return speed;
}

uint16_t Speed_GetSpeed128x()
{
	return speed128x;
}

/**
 * speed raw value = phy / 0.05625
 * phy range: [0, 160] km/h
 */
uint16_t Speed_GetRawSpeed()
{
	return (((uint32_t)speed128x) * 10) / 72;
}


